package org.lites.dcimmodifier;

import android.annotation.SuppressLint;
import android.content.Context;
import android.database.Cursor;
import android.media.ExifInterface;
import android.media.MediaMetadataRetriever;
import android.net.Uri;
import android.provider.MediaStore;
import org.apache.commons.io.FilenameUtils;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.FileTime;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.format.DateTimeFormatter;
import java.util.*;

/**
 * 图片、视频处理工具类
 */
public class ImageUtils {
    /**
     * 获取图片、视频文件的时间戳
     * @param dcimFile 待处理图片、视频文件
     * @return 文件时间戳
     */
    public static String getDCIMTimestamp(File dcimFile) {

        String dcimType = FilenameUtils.getExtension(dcimFile.getName());

        Set<String> type_image_list = new HashSet<>(Arrays.asList(Constants.TYPE_IMAGE));
        Set<String> type_video_list = new HashSet<>(Arrays.asList(Constants.TYPE_VIDEO));
        String timestamp = null;
        if (type_image_list.contains(dcimType)) {
            timestamp = getImageDate(dcimFile);
        }
        else if (type_video_list.contains(dcimType)) {
            timestamp = getVideoDate(dcimFile.getPath());
        }
        if(timestamp == null){
            timestamp=TimeStampExtractor.extractValidTimestamp(dcimFile.getName());
        }
        return timestamp;
    }
    /**
     * 获取图片文件的时间戳
     * @param photoFile 待处理图片文件
     * @return 文件时间戳
     */
    public static String getImageDate(File photoFile) {
        try {
            ExifInterface exif = null;
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
                exif = new ExifInterface(photoFile);
            }

            // 获取拍摄时间的 EXIF 标签 (TAG_DATETIME)
            assert exif != null;

            String timestamp=exif.getAttribute(ExifInterface.TAG_DATETIME);//ExifInterface.TAG_DATETIME_ORIGINAL

            if (timestamp != null) {
                return timestamp;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 获取视频文件的时间戳
     * @param context 上下文
     * @param videoPath 待处理视频文件
     * @deprecated 暂不使用，效果不好
     * @return 文件时间戳
     */
    @Deprecated
    public static String getVideoDate(Context context, String videoPath) {
        Uri uri = Uri.fromFile(new File(videoPath));
        String[] projection = {MediaStore.Video.Media.DATE_TAKEN};
        String date=null;
        Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
        if (cursor != null && cursor.moveToFirst()) {
            long dateTaken = cursor.getLong(0);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss", Locale.getDefault());
            date = sdf.format(new Date(dateTaken));
            cursor.close();
        }
        return date;
    }
    /**
     * 获取视频文件的时间戳
     * @param videoPath 待处理视频文件
     * @return 文件时间戳
     */
    public static String getVideoDate(String videoPath) {
        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        try {
            retriever.setDataSource(videoPath);
            String date = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DATE);
            // 解析时间格式"20250219T090004.000Z"
            SimpleDateFormat inputFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss.SSS'Z'");
            inputFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
            Date dt = inputFormat.parse(date);
            // 格式化输出 yyyy:MM:dd HH:mm:ss
            SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");
            date = outputFormat.format(dt);
            if(date.contains("1904:01:01")){
                date=null;
            }
            return date;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            retriever.release();
        }
    }

    /**
     * 获取图片、视频文件的拍摄时间、修改时间信息
     * @param photofilename
     * @return
     */
    public static String imageInfoGetter(String photofilename){
        File photoFile=new File(photofilename);
        String modifiedtime="";
        String dateTime = getDCIMTimestamp(photoFile);
        String beforetimestr= "";
        String aftertimestr="";
        if(dateTime!=null){

            try{// Step 2: 解析拍摄时间为 Date 对象
                @SuppressLint("SimpleDateFormat") SimpleDateFormat sdf = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");
                Date photoDate = sdf.parse(dateTime);
                if(photoDate!=null){
                    // Step 3: 将 Date 转换为 FileTime
                    FileTime aftertime = FileTime.fromMillis(photoDate.getTime());
                    aftertimestr=aftertime.toString();
                }
            } catch (ParseException e) {
                throw new RuntimeException(e);
            }
        }
        Path photoPath = photoFile.toPath();
        try{
            beforetimestr=Files.getLastModifiedTime(photoPath).toString();
        }catch(IOException e){
            e.printStackTrace();
        }
        if(!beforetimestr.equals("")){
            if(aftertimestr.equals("")){
                aftertimestr=beforetimestr;
            }
            modifiedtime=String.format("%s->%s",beforetimestr,aftertimestr);
        }
        return modifiedtime;
    }

    /**
     * 修改图片、视频文件的修改时间为拍摄时间
     * @param filepath 待处理文件
     * @param aftertimestr 拍摄时间
     */
    public static void imageTimeModifier(String filepath,String aftertimestr){
        File file=new File(filepath);
        FileTime aftertime = FileTime.from(Instant.from(DateTimeFormatter.ISO_INSTANT.parse(aftertimestr)));
        try{
            // Step 4: 使用 Files API 修改文件的创建时间和修改时间
            Files.setLastModifiedTime(file.toPath(), aftertime);
        }catch(IOException e){
            e.printStackTrace();
        }
    }
}
